#ifndef 	ETH_FRAME_H
#define 	ETH_FRAME_H

//#include <stdio.h>
 
#define 	LENETH		1518	//Длина максимального кадра
#define		LENDATA		1500	//Длина данных в ethernet frame
#define		LENMAC		6		//Длина MAC
#define		LENETHTYPE	2		//Длина заголовка типа ethernet пакета
#define 	LENCRC		4		//Длина заголовка crc checksum
#define		ETHERTYPE	0x0800	//Код IP протокола



struct eth{
	int d[LENMAC];
	int s[LENMAC];
	unsigned char strd[17];	// Строка с адрессом в формате FF:FF:FF:FF:FF:FF
	unsigned char strs[17];
	int type[LENETHTYPE];
	char strt[4];
	unsigned long crc[LENCRC];
};

class eth_frame{
public:
	int incapeth(unsigned char *buffer, int lenrecvpack);	//Тут получает наш класс данные
	int* getmacd();		//Получить МАС назначения
	int* getmacs();		//Получить МАС исходящего устройства
	int getethtype();	//Получить тип фрейма
	unsigned long getcrc();
	int data[1500];
	int getlendata() {return lendata; };
private:
	eth str;
	int lendata;		//Длина данных которые несёт кадр
};
unsigned long eth_frame::getcrc()
{
				// Возможно не правильно +, может нужно делать или |
	return str.crc[3] + (str.crc[2] << 8) + (str.crc[1] << 16) + (str.crc[0] << 24); 
};
int eth_frame::getethtype()
{
	return str.type[1] + (str.type[0] << 8);
};
int* eth_frame::getmacd()
{
	return str.d;
};
int* eth_frame::getmacs()
{
	return str.s;	
};
int eth_frame::incapeth(unsigned char *buffer, int lenrecvpack)
{
	if (lenrecvpack <= 0) return -1;
	int i=0;
	lendata=0;
	for (;i<LENMAC; i++) str.d[i]=buffer[i];
	for (;i<LENMAC*2; i++) str.s[i-LENMAC]=buffer[i];
	for (;i<LENMAC*2+LENETHTYPE; i++) str.type[i-LENMAC*2]=buffer[i];
	for (;i<lenrecvpack-LENCRC; i++) data[i-14]=buffer[i];
	lendata = i-14;
	str.crc[0]=buffer[i]; str.crc[1]=buffer[++i]; str.crc[2]=buffer[++i]; str.crc[3]=buffer[++i];	
	return lenrecvpack-i;		//Должно быть равно нулю
};

#endif
